﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using PrimeraAFantasyFootballl.Models;
using System.Web.Security;

namespace PrimeraAFantasyFootballl.Controllers
{
    public class EquipoController : Controller
    {
        //
        // GET: /Equipo/
        EquipoRepository equipoRepository = new EquipoRepository();
        JugadorRepository jugadorRepository = new JugadorRepository();
        EstadisticaRepository estadisticaRepository = new EstadisticaRepository();
        UsuarioRepository usuariorepository = new UsuarioRepository();
        Puntos_EquipoRepository puntosrepository = new Puntos_EquipoRepository();

        Jugador_en_EquipoRepository jugadorenequiporepository = new Jugador_en_EquipoRepository();

        public ActionResult Index()
        {
            var equipos = equipoRepository.FindAllTeams().ToList();
            return View("Index", equipos);
        }

        //
        // GET: /Equipo/Details/numeroywea!
        public ActionResult Details(int id) 
        {   
            List<Jugador_en_Equipo> jugadoresenequipo = new List<Jugador_en_Equipo>();
            Equipo equipo = equipoRepository.GetEquipo(id);

            foreach (var jeq in jugadorenequiporepository.FindAll())
            {
                if (jeq.EquipoID.Equals(id)) { jugadoresenequipo.Add(jeq); }
            }
            jugadoresenequipo.Sort();

            ViewData["PuntosEquipo"] = puntosrepository.GetPuntosTotales(id).ToString();
            if (jugadoresenequipo.Count() == 0) { return View("SinJugadores", equipo); }
            else return View(jugadoresenequipo);
                  
        }

        public IQueryable<Jugador_en_Equipo> JugadoresenEquipodeunequipo(int id) 
         {  
        
            IQueryable<Jugador_en_Equipo> pit = jugadorenequiporepository.FindAll();
            return from bla in pit
                   where bla.EquipoID == id
                   select bla;
        
        }
        //
        // GET: /Equipo/EditarFormación/numeroywea!
        public ActionResult EditarFormación(int id){
            List<Jugador_en_Equipo> jeqs = new List<Jugador_en_Equipo>();
            foreach (Jugador_en_Equipo jeeq in JugadoresenEquipodeunequipo(id))
                jeqs.Add(jeeq);
                jeqs.Sort();      
 
            return View(jeqs.AsQueryable<Jugador_en_Equipo>());
        }


        //
        // POST: /Equipo/EditarFormación/numeroywea!
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditarFormación(int id, FormCollection formValues) 
        {

            List<Jugador_en_Equipo> jeq = JugadoresenEquipodeunequipo(id).ToList();

            jeq.Sort();

            //Aquí se inicia el checkeo de la formación para ver si es válida

            int totaltitulares = 0;
            int totalarquero = 0;
            int totaldef = 0;
            int totalmed = 0;
            int totaldel = 0;
            string error = "";

            foreach (var jugadorenequipo in jeq)
            {
                string prueba = Request.Form["Titular" + jugadorenequipo.JugadorID.ToString()];
                if (Request.Form["Titular" + jugadorenequipo.JugadorID.ToString()].Equals("false")) { }
                else
                {                  
                totaltitulares++;
                if (jugadorenequipo.Jugador.Posicion == 1) totalarquero++;
                if (jugadorenequipo.Jugador.Posicion == 2) totaldef++;
                if (jugadorenequipo.Jugador.Posicion == 3) totalmed++;
                if (jugadorenequipo.Jugador.Posicion == 4) totaldel++;                                                      
                }
            }
            if (totaltitulares != 11) { /* Caso 1 */ error = "No hay 11 titulares en el equipo." + "&"; }
            if (totalarquero < 1) { /* Caso 2 */ error += "No hay un arquero titular en el equipo." + "&"; }
            if (totalarquero > 1) { /* Caso 3 */ error += "Hay mas de un arquero titular en el equipo." + "&"; }
            if (totaldef == 3 && totaldef == 5 && totaldel == 2) { }
            else
            {
                if (totaldef == 3 && totalmed == 4 && totaldel == 3) { }
                else
                {
                    if (totaldef == 4 && totalmed == 4 && totaldel == 2) { }
                    else
                    {
                        if (totaldef == 4 && totalmed == 3 && totaldel == 3) { }
                        else
                        {
                            if (totaldef == 4 && totalmed == 5 && totaldel == 1) { }
                            else
                            {
                                if (totaldef == 5 && totalmed == 3 && totaldel == 2) { }
                                else
                                {
                                    if (totaldef == 5 && totalmed == 4 && totaldel == 1) { }
                                    else
                                    {
                                        if (totaldef == 3 && totalmed == 5 && totaldel == 2) { }
                                        else
                                        {
                                            /* Caso 3 */
                                            error += "La formación elegida no es válida.";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (error.Equals("")) { }
            else
            {
                error = "La formación no pudo ser actualizada debido a los siguientes errores:&" + error;
                ViewData["Error"] = error;
                return View("EditarFormación",jeq);
            }



            //Aquí se termina el checkeo

            foreach(var jugadorenequipo in jeq)
            {             
                bool check = true;
                string prueba = Request.Form["Titular" + jugadorenequipo.JugadorID.ToString()];
                if (Request.Form["Titular"+jugadorenequipo.JugadorID.ToString()].Equals("false")) { check = false; }

                jugadorenequipo.Titular = check;
                jugadorenequiporepository.Save();
            }

            ViewData["PuntosEquipo"] = puntosrepository.GetPuntosTotales(jeq[0].EquipoID).ToString();
            return View("Details", jeq);

            
        }

        public ActionResult Transferencias(int id)
        {
            List<Jugador> delequipo = new List<Jugador>();
            List<Jugador> ajenos = new List<Jugador>();
            
            foreach (var eljug in jugadorRepository.FindAllPlayers())
                ajenos.Add(eljug);

            foreach (Jugador_en_Equipo jeeq in equipoRepository.GetEquipo(id).Jugador_en_Equipos)
            {  Jugador jgdr = jugadorRepository.GetJugador(jeeq.JugadorID);
                delequipo.Add(jgdr);
                ajenos.Remove(jgdr);
                           }
            
            delequipo.Sort();
            delequipo.Add(null);
            ajenos.Sort();
            
            string precios = "";
            foreach (Jugador jj in delequipo.Concat(ajenos))
               if (jj != null) precios += estadisticaRepository.GetUltimaEstadistica(jj.JugadorID).Precio + "&";
                else precios += "X&";

            Jugador dummy = new Jugador(-1, precios, equipoRepository.GetEquipo(id).Nombre, equipoRepository.GetEquipo(id).Dinero);
         
            ajenos.Add(dummy);
            IQueryable<Jugador> listajugs = delequipo.Concat(ajenos).AsQueryable<Jugador>();
            
            return View(listajugs);


                   
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Transferencias(int id, FormCollection collection)
        {
            List<Jugador> ventas = new List<Jugador>();
            List<Jugador> compras = new List<Jugador>();
          
            foreach (var eljug in jugadorRepository.FindAllPlayers())
            {
                int jugid = eljug.JugadorID;
                //string prueba = Request.Form["chkbx" + jugid.ToString()];
              
                if (!Request.Form["chkbx" + jugid.ToString()].Equals("false"))
                {
                    if (jugadorenequiporepository.GetJugadorenEquipo(jugid, id) != null)
                        ventas.Add(eljug);
                    else compras.Add(eljug);

                }}
            string[] campostabla = {"", "Nombre", "Club", "Posición" };
            ViewData["titulotabla1"] = "Ventas:";
            ViewData["titulotabla2"] = "Compras:";
            ViewData["campotabla1"] = campostabla[1];
            ViewData["campotabla2"] = campostabla[2];
            ViewData["campotabla3"] = campostabla[3];
            ViewData["header"] = "Confirmar Transferencias";

           return View("ConfirmarTransferencias",GetResumenTransferencia(id,ventas,compras,false).AsQueryable<Jugador>());
                

        }


        public ActionResult ConfirmarTransferencias(int id, IQueryable<Jugador> listatransfers)
        {
          return  View(listatransfers);           

        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult ConfirmarTransferencias(int id, FormCollection collection)
        {
            string output = Request.Form["txtbox"].ToString();
            if (!output.Contains('¿') && !output.Contains('*'))
            {
                int dinero = equipoRepository.GetEquipo(id).Dinero;

                List<Jugador> CurrentTransfer = new List<Jugador>();
                foreach (string jid in output.Split(';'))
                    if (jid.Length > 0) CurrentTransfer.Add(jugadorRepository.GetJugador(Int32.Parse(jid)));


                foreach (Jugador jug in CurrentTransfer)
                {
                    if (jug.JugadorID < 0 || jug == null) continue;


                    if (jugadorenequiporepository.GetJugadorenEquipo(jug.JugadorID, id) != null)
                    {
                        jugadorenequiporepository.Delete(jugadorenequiporepository.GetJugadorenEquipo(jug.JugadorID, id));
                        dinero += estadisticaRepository.GetUltimaEstadistica(jug.JugadorID).Precio;

                    }
                    else
                    {
                        Jugador_en_Equipo jeeq = new Jugador_en_Equipo();
                        jeeq.EquipoID = id;
                        jeeq.JugadorID = jug.JugadorID;
                        jeeq.Titular = false;

                        jugadorenequiporepository.Add(jeeq);
                        dinero -= estadisticaRepository.GetUltimaEstadistica(jug.JugadorID).Precio;

                    }

                    equipoRepository.GetEquipo(id).Dinero = dinero;
                    equipoRepository.Save();
                    jugadorenequiporepository.Save();

                }
            }
            if (output.Contains('*'))
            {
                ViewData["nombreequipo"] = equipoRepository.GetEquipo(id).Nombre;
                string b = id.ToString();
                return RedirectToAction(b, "Equipo/CrearEquipo");
            }

            else
            {   ViewData["Error"] = "";
                List<Jugador_en_Equipo> jugeneq = equipoRepository.GetEquipo(id).Jugador_en_Equipos.ToList();
                jugeneq.Sort();
                return RedirectToAction(id.ToString(), "Equipo/EditarFormación", jugeneq.AsQueryable<Jugador_en_Equipo>());
            }
        }

        //
        // GET: /Equipo/Create

        public ActionResult Create()
        {

            return View("Create");
        }
        //
        // POST: /Equipo/Create


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(FormCollection collection)
        {
            Equipo equipo = new Equipo();
            try
            {
                UpdateModel(equipo);
                equipoRepository.Add(equipo);
                
                equipoRepository.Save();
                
                usuariorepository.GetUsuario(User.Identity.Name).EquipoID = equipo.EquipoID;
                UpdateModel(usuariorepository.GetUsuario(User.Identity.Name));
                usuariorepository.Save();
		ViewData["nombreequipo"] = equipo.Nombre;
                Roles.CreateRole(equipo.Nombre);
                
                string[] lista = new string[1];
                lista[0] = User.Identity.Name;

                Roles.AddUsersToRole(lista,equipo.Nombre);

                // TODO: Add insert logic here
                int a = equipo.EquipoID;
                string b = a.ToString();
                return RedirectToAction(b, "Equipo/CrearEquipo");

            
            }
            catch
            {
                foreach (var issue in equipo.GetRuleViolations())
                {
                    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
                }
                return View(equipo);
            }
        }



        public ActionResult CrearEquipo(int id) {

            List<Jugador> todos = new List<Jugador>();

            foreach (var eljug in jugadorRepository.FindAllPlayers())
                todos.Add(eljug);

            todos.Sort();
            ViewData["nombreequipo"] = equipoRepository.GetEquipo(id).Nombre;
            string precios = "";
            foreach (Jugador jj in todos)
               precios += estadisticaRepository.GetUltimaEstadistica(jj.JugadorID).Precio + "&";

            ViewData["precios"] = precios;

            return View(todos.AsQueryable<Jugador>());
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult CrearEquipo(int id, FormCollection collection)
        {
                List<Jugador> compras = new List<Jugador>();
                
                foreach (var eljug in jugadorRepository.FindAllPlayers())
                {
                    int jugid = eljug.JugadorID;
                    if (jugid < 0) continue;
                    Object wea = Request.Form;
                    if (!Request.Form["chkbx" + jugid.ToString()].Equals("false"))
                    {
                            compras.Add(eljug);
                    }
                }
                string campostabla = "";
                ViewData["titulotabla1"] = "";
                ViewData["titulotabla2"] = "Jugadores Seleccionados";
                ViewData["campotabla1"] = campostabla;
                ViewData["campotabla2"] = campostabla;
                ViewData["campotabla3"] = campostabla;
                ViewData["header"] = "Confirmar Jugadores de " + equipoRepository.GetEquipo(id).Nombre ;


                return View("ConfirmarTransferencias", GetResumenTransferencia(id, new List<Jugador>(), compras, true).AsQueryable<Jugador>());


            }


        IEnumerable<Jugador> GetResumenTransferencia(int id, List<Jugador> ventas, List<Jugador> compras, bool nuevo)
        {
            Equipo elequipo = equipoRepository.GetEquipo(id);
            
            int dineroPre = elequipo.Dinero;
            int dineroPost = dineroPre;
            int dineroIn = 0;
            int dineroOut = 0;
            string msjc = "";

            foreach (Jugador vendido in ventas)
                dineroIn += estadisticaRepository.GetUltimaEstadistica(vendido.JugadorID).Precio;

            foreach (Jugador comprado in compras)
                dineroOut -= estadisticaRepository.GetUltimaEstadistica(comprado.JugadorID).Precio;

            dineroPost += dineroIn + dineroOut;
            string msjn;

            if (nuevo) msjn ="&Inicial:  $" + dineroPre+
                             "&Invertido:  $" + -dineroOut+
                              "&Restante:  $"+ dineroPost + "&&";

            else msjn=            
            "&Original: $" + dineroPre +
                "&Entrante por ventas: $" + dineroIn +
                "&Saliente por compras: $" + -dineroOut +
                "&&Neto resultante $" + dineroPost + "&&";


            if (dineroPost < 0) msjc += "No puede quedar con saldo negativo (-$" + -dineroPost + ")&";

            List<Jugador> potencialequipo = new List<Jugador>();

            foreach (Jugador_en_Equipo jeeq in equipoRepository.GetEquipo(id).Jugador_en_Equipos)
            {
                Jugador jgdr = jugadorRepository.GetJugador(jeeq.JugadorID);
                if (!ventas.Contains(jgdr)) potencialequipo.Add(jgdr);
            }

            foreach (Jugador jug in compras)
                potencialequipo.Add(jug);
        
        
       
            string ret = "";

            if (potencialequipo.Count < 15 || potencialequipo.Count>20) ret += "Debe tener entre 15 y 20 jugadores. (no puede quedar con " + potencialequipo.Count + ")&";
            

            int[] jugsporposicion = new int[5];
            foreach (Jugador jug in potencialequipo)
            jugsporposicion[jug.Posicion]++;

            if (jugsporposicion[1] < 1) ret += "No puede quedar sin arquero&";
            if (jugsporposicion[2] < 4) ret += "No puede quedar con menos de 4 defensas&";
            if (jugsporposicion[3] < 3) ret += "No puede quedar con menos de 3 mediocampos&";
            if (jugsporposicion[4] < 2) ret += "No puede quedar con menos de 2 delanteros&";

            Dictionary<string, int> JeClubs = new Dictionary<string, int>();

            foreach (Jugador jug in potencialequipo)
            if (JeClubs.Keys.Contains(jug.Club))   JeClubs[jug.Club] = JeClubs[jug.Club] + 1;
                else JeClubs.Add(jug.Club, 1);
            
            foreach (KeyValuePair<string, int> par in JeClubs)
                if (par.Value > 3) ret += "No puede tener " + par.Value + " jugadores de "+par.Key+". El máximo es de 3 por equipo&";

            msjc += ret;

            bool ok = msjc.Length == 0;

            string descriperrores = "¡Transferencias con errores!";//Las transferencias no se pueden realizar debido a las siguientes razones:";
            if (nuevo) descriperrores = "¡Su selección de jugadores tiene errores!";// "La selección de jugadores tiene los siguientes errores:";

            if (ok && nuevo) msjc = "¡Tu equipo ahora está listo para ser creado!&Presiona aceptar para crear tu equipo";
            else if (ok && !nuevo) msjc = "Transferencias válidas&Presione aceptar para realizar las transferencias";
            else msjc =   descriperrores + "&" + msjc + "& &";



            int did = -1;
            if (!ok) did = -2;

            if (ok)
            {
                foreach (Jugador j in ventas.Concat(compras))
                    msjn += j.JugadorID + ";";
            }
            else if (nuevo) msjn += "*";
            else msjn += "¿";
            
            Jugador dummy = new Jugador(did, msjn, msjc, id);
            ventas.Add(dummy);

            return ventas.Concat(compras).AsEnumerable<Jugador>();
        }


        public ActionResult PuntosFecha() {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult PuntosFecha(FormCollection collection)
        {
            var equipos = equipoRepository.FindAllTeams().ToList();
            int jugadorfecha = 0;
            foreach (Equipo e in equipos)
            {
                int puntos=0;
                foreach (Jugador_en_Equipo jeq in JugadoresenEquipodeunequipo(e.EquipoID))
                {
                    if (jeq.Titular)
                    {
                        puntos += estadisticaRepository.GetUltimaEstadistica(jeq.JugadorID).Puntos;
                    }
                    jugadorfecha = jeq.JugadorID;
                }
                puntosrepository.Add(new Puntos_Equipo(e.EquipoID,estadisticaRepository.GetUltimaEstadistica(jugadorfecha).Fecha,puntos));
                puntosrepository.Save();
            }
            return View("Index",equipos );
        }



  
              


    }
}
